package Test;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

import Componentes.GeneradorPiezas;
import Componentes.Input;
import Componentes.Maquina;
import Componentes.Output;
import Componentes.Pieza;
import Componentes.Robot;

public class testcamino3 {
	
	private Maquina m2;	
	private Maquina m3;		
	private Maquina m4;
	private Robot r1;
	private Robot r2; 
	private Robot r3; 
	private Input i3;
	private Input i2;
	private Pieza pieza1;
	private Pieza pieza2;
	private Pieza piezaresultante;
	private Output o3;
	
	@Before
	public void setUp() throws Exception {
		i3 = new Input(3);
		Thread generadorinput3 = new Thread (new GeneradorPiezas(i3));
		generadorinput3.start();
		
		i2 = new Input(2);
		Thread generadorinput2 = new Thread (new GeneradorPiezas(i2));
		generadorinput2.start();
		
		m2 = new Maquina(2);
		m3 = new Maquina(3);	
		m4 = new Maquina(4);
		r1 = new Robot(1);
		r2 = new Robot(2);
		r3 = new Robot(3);
		o3 = new Output(3);
		
		//Tiempo para generar piezas en input
		Thread.sleep(200);
		
		pieza1 = r3.Moverpieza(i3, m2, 1);
		m2.procesarPieza(pieza1, 1);
		pieza2 = r3.Moverpieza(i3, m4, 1);
		m4.procesarPieza(pieza2, 1);
		
	}
	
	@Test
	public void testcantpiezasTerminadas() {
		//Testeo que luego de enviar una pieza para procesar a m2 desde el input 2 y a m4 desde i3, en las mismas aya una pieza terminada.
		
		//Tiempo para que se procese la pieza;
		try {
			Thread.sleep(200);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		int cantterminadas1 = m2.cantTerminadas();
		int cantterminadas2 = m4.cantTerminadas();
		
		assertEquals("Test cantidad piezas terminadas en m2", 1, cantterminadas1);
		assertEquals("Test cantidad piezas terminadas en m4", 1, cantterminadas2);
	}
	
	@Test
	public void testMoverdem2ym4am3() {
		/** Testeo que luego de procesar la pieza en m2 y otra en m4, muevo las mismas a m3 con r2 para que las procese,
		 * y chequeo la cantTerminadas en m1, m2 y m3. */
		piezaresultante = r2.Moverpieza(pieza1, m2, pieza2, m4, m3, 10);	
		m3.procesarPieza(piezaresultante, 1);	
		
		//Tiempo para que se procese la pieza;
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		
		
		int cantterminadas2 = m2.cantTerminadas();
		int cantterminadas3 = m3.cantTerminadas();
		int cantterminadas4 = m4.cantTerminadas();
		assertEquals("Test cantidad piezas terminadas en m2", 0, cantterminadas2);
		assertEquals("Test cantidad piezas terminadas en m3", 1, cantterminadas3);
		assertEquals("Test cantidad piezas terminadas en m4", 0, cantterminadas4);
		
	}
	
	@Test
	public void testPiezacombinada() {
		/** Testeo que luego de procesar la pieza en m2 y otra en m4, muevo las mismas a m3 con r2 para que las procese,
		 * y chequeo que getPiezaTerminada me devuelva la suma de ambas */
		piezaresultante = r2.Moverpieza(pieza1, m2, pieza2, m4, m3, 10);	
		m3.procesarPieza(piezaresultante, 1);
		
		//Tiempo para que se procese la pieza;
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		
		
		Pieza piezaenm3 = m3.getPiezaTerminada(piezaresultante);
		assertEquals("Test cantidad piezas terminadas en m4", piezaresultante, piezaenm3);
		
	}
	
	@Test
	public void testMoveraOutput(){
		/** Testeo que luego de procesar la pieza en m3, muevo la misma de m3 con r1 a o3,
		 * y chequeo la cantTerminadas en m3 y cantPiezas en o3. */
		
		piezaresultante = r2.Moverpieza(pieza1, m2, pieza2, m4, m3, 10);		
		m3.procesarPieza(piezaresultante, 1);	
		
		//Tiempo para que se procese la pieza;
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		
		r1.Moverpieza(piezaresultante, m3, o3, 1);	
		
		int cantterminadas3 = m3.cantTerminadas();
		assertEquals("Test cantidad piezas terminadas en m3", 0, cantterminadas3);
		int cantterminadaso3 = o3.cantPiezas();
		assertEquals("Test cantidad piezas terminadas en o3", 1, cantterminadaso3);	
	}

}
